#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <assert.h>
using namespace std;

class Date {
public:
	//友元函数
	//friend inline ostream& operator<<(const ostream& out, const Date& d); //error
	friend ostream& operator<<(ostream& out, const Date& d);
	friend istream& operator>>(istream& in, Date& d);

	//【缺省构造函数】
	Date(int year = 1, int month = 1, int day = 1);

	//【析构函数】
	// 这里日期类的属性不涉及动态开辟的内存，所以不用自己写析构

	//【拷贝构造函数】
	// 这里日期类的属性不涉及动态开辟的内存，所以不用自己写拷贝构造
	//Date(const Date& d);

	//【赋值重载】
	// 这里日期类的属性不涉及动态开辟的内存，所以不用自己写赋值重载
	// d1 = d2; ——>  d1.operator=(d2)
	// this就是左操作数
	//Date& operator=(const Date& d);

	//【其他运算符重载】
	bool operator==(const Date& d);
	bool operator!=(const Date& d);

	bool operator>(const Date& d);
	bool operator>=(const Date& d);
	bool operator<(const Date& d);
	bool operator<=(const Date& d);

	Date operator+(int x);
	Date& operator+=(int x);
	Date operator-(int x);
	Date& operator-=(int x);
	int operator-(const Date& d);

	Date& operator++();
	Date operator++(int);
	Date& operator--();
	Date operator--(int);

	void PrintDate() { //直接在类里面 定义 的成员函数(即有函数体)，默认是inline
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

inline ostream& operator<<(ostream& out, const Date& d) {
	out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
	return out;
}

inline istream& operator>>(istream& in, Date& d) {
	in >> d._year >> d._month >> d._day;
	return in;
}